package br.medmark.servico;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.servlet.http.HttpSession;

import br.com.medmark.model.hibernate.AlocacaoProfissional;
import br.com.medmark.model.hibernate.AreaAtuacao;
import br.com.medmark.model.hibernate.Clinica;
import br.com.medmark.model.hibernate.Consulta;
import br.com.medmark.model.hibernate.Horario;
import br.com.medmark.model.hibernate.Paciente;
import br.com.medmark.model.hibernate.Profissao;
import br.com.medmark.model.hibernate.Profissional;
import br.com.medmark.model.hibernate.Solicitacao;
import br.com.medmark.model.hibernate.dao.AlocaoProfissionalDAO;
import br.com.medmark.model.hibernate.dao.ClinicaDAO;
import br.com.medmark.model.hibernate.dao.ConsultaDAO;
import br.com.medmark.model.hibernate.dao.HorarioDAO;
import br.com.medmark.model.hibernate.dao.PacienteDAO;
import br.com.medmark.model.hibernate.dao.ProfissionalDAO;
import br.com.medmark.model.hibernate.dao.SolicitacaoDAO;
import br.com.medmark.model.hibernate.dao.UtilDAOImpl;
import br.medmark.util.Constantes;
import br.medmark.util.Funcoes;
import br.medmark.util.Persistencia;

public class ClinicaServico implements Serializable{
	
	private static final long serialVersionUID = 3806000142286213603L;
	
	@Inject
	private ClinicaDAO dao = ClinicaDAO.getInstance();
	
	private AlocaoProfissionalDAO alocacaoDAO = AlocaoProfissionalDAO.getInstance();
	private SolicitacaoDAO solicitacaoDAO = SolicitacaoDAO.getInstance();
	private ProfissionalDAO profDAO = ProfissionalDAO.getInstance();
	private PacienteDAO pacienteDAO = PacienteDAO.getInstance();
	private HorarioDAO horarioDAO = HorarioDAO.getInstance();
	private Persistencia persistencia = Persistencia.getInstance();
	private ConsultaDAO consultaDAO = ConsultaDAO.getInstance();
	public final static String paginaInicialClinicas = "/pages/indexCli?faces-redirect=true";
	
	
	private static ClinicaServico clinicaServico;
	private ClinicaServico(){
		
	}
	
	public static ClinicaServico getInstance(){
		
		if ( clinicaServico == null) {
			clinicaServico = new ClinicaServico();
		}
	
		return clinicaServico;
		
	}
	
	public Clinica validaUsuario(String login, String senha) {
		Clinica clinica = dao.getClinica(login, senha);
		if(clinica != null && clinica.getLogin().equals(login) && clinica.getSenha().equals(senha)){
			return clinica;
		}
		return null;
	}
	
	public String exibeTelaInicial(){
		return paginaInicialClinicas;
	}
	
	public void criaProfissional(int codigoProfissao,int codigoAreaAtuacao,String rua,String bairro,
			String complemento,String numero,String cidade,String estado,String telefone1,
			String telefone2,String cpf,String nome,String removido) throws Exception{
		
		FacesContext facesContext = FacesContext.getCurrentInstance();
		HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(true);
		Clinica clinica = (Clinica) session.getAttribute("clinica");
		
		AreaAtuacao area = UtilDAOImpl.getInstance().getAreaAtuacao(codigoAreaAtuacao);
		Profissao profissao = UtilDAOImpl.getInstance().getProfissao(codigoProfissao);
		
		
		Profissional prof = new Profissional();
		prof.setBairro(bairro);
		prof.setBairro(cidade);
		prof.setAreaAtuacao(area);
		prof.setEstado(estado);
		prof.setProfissao(profissao);
		prof.setComplemento(complemento);
		prof.setCpf(cpf);
		prof.setNome(nome);
		prof.setNumero(numero);
		prof.setRua(rua);
		prof.setTelefone1(telefone1);
		prof.setTelefone2(telefone2);
		prof.setRemovido(removido);


		try {
		//	prof = profDAO.save(prof);
		//	profDAO.save(prof);
			AlocacaoProfissional alocacao = new AlocacaoProfissional();		
			alocacao.setProfissional(prof);
			alocacao.setClinica(clinica);
			//alocacaoDAO.save(alocacao);
			Persistencia.getInstance().salvar(alocacao);

			clinica.getAlocacoes().add(alocacao);
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}


	public static void criaHorario(Date data, Date dataInicial,
			Date dataFinal, int numeroVagas,int codigoClinica, int codigoProfissional,String valorRadio) throws Exception {
			int valor = Integer.parseInt(valorRadio);
			
			if (valor == Constantes.TIPO_HORARIO_ORDEM_CHEGADA) {
				
			if (Funcoes.diferencaMaiorIgualUmDia(dataInicial, dataFinal)) {
				Long diferencaDias = Funcoes.diferencaDias(dataInicial, dataFinal);
				for (int i = 0; i <= diferencaDias; i++) {
					
					Calendar cDataFinal = new GregorianCalendar();
					Calendar cAux = new GregorianCalendar();
					cDataFinal.setTime(dataFinal);
					
					dataInicial = Funcoes.adicionaDia(dataInicial, i).getTime();
					cAux.setTime(dataInicial);
					cDataFinal.set(Calendar.DAY_OF_MONTH, cAux.get(Calendar.DAY_OF_MONTH));
					cDataFinal.set(Calendar.MONTH,cAux.get(Calendar.MONTH));
					cDataFinal.set(Calendar.YEAR,cAux.get(Calendar.YEAR));
					Horario horario = new Horario();
					horario.setClinica(ClinicaDAO.getInstance().getClinica(codigoClinica));
					horario.setProfissional(ProfissionalDAO.getInstance().getProfissional(codigoProfissional));
					horario.setTipoHorario(valor);
					horario.setDataConsulta(data);
					horario.setHoraInicial(dataInicial);
					horario.setHoraFinal(cDataFinal.getTime());
					horario.setNumeroVagas(numeroVagas);
					horario.setRemovido("N");
					
					HorarioDAO.getInstance().save(horario);
					
					
					}
			}
				else{
				
					Horario horario = new Horario();
					horario.setClinica(ClinicaDAO.getInstance().getClinica(codigoClinica));
					horario.setProfissional(ProfissionalDAO.getInstance().getProfissional(codigoProfissional));
					horario.setTipoHorario(valor);
					horario.setDataConsulta(data);
					horario.setHoraInicial(dataInicial);
					horario.setHoraFinal(dataFinal);
					horario.setNumeroVagas(numeroVagas);
					horario.setRemovido("N");
				
					HorarioDAO.getInstance().save(horario);
				
				}
				
			}else{
				
				Horario horario = new Horario();
				horario.setClinica(ClinicaDAO.getInstance().getClinica(codigoClinica));
				horario.setProfissional(ProfissionalDAO.getInstance().getProfissional(codigoProfissional));
				horario.setTipoHorario(valor);
				horario.setDataConsulta(data);
				horario.setHoraInicial(dataInicial);
				horario.setHoraFinal(dataFinal);
				horario.setNumeroVagas(numeroVagas);
				horario.setRemovido("N");
				HorarioDAO.getInstance().save(horario);
				
			}
			
	}
	
	
	public List<Solicitacao> listaSolicitacoes(int codigoClinica,int status){
		
		List<Solicitacao> solicitacoes = solicitacaoDAO.getSolicitacoes(codigoClinica,status);
		
		return solicitacoes;
		
	}
	
	
	public void criarConsulta(Solicitacao solicitacao){
		
		Consulta consulta = new Consulta();
		solicitacao.setStatusSolicitacao(Constantes.STATUS_SOLICITACAO_ACEITA);
		consulta.setSolicitacao(solicitacao);
		consulta.setStatus(Constantes.STATUS_CONSULTA_CONFIRMADA);
		try {
			Persistencia.getInstance().atualizar(consulta);
		//	consultaDAO.save(consulta);
		} catch (Exception e) {
		
			e.printStackTrace();
		}
		
	}

	public void rejeitarSolicitacao(Solicitacao solicitacao) {
		

		solicitacao.setStatusSolicitacao(Constantes.STATUS_SOLICITACAO_REJEITADA);
		try {
			persistencia.atualizar(solicitacao);
		} catch (Exception e) {
		
			e.printStackTrace();
		}
		
	}

	public List<Profissional> listaProfissionais(int codigoClinica) {
		List<Profissional> listaProfissionais = new ArrayList<Profissional>();
		
		listaProfissionais = ClinicaDAO.getInstance().listarProfissionais(codigoClinica);
		
		return listaProfissionais;
	}
	
}
